JavaScriptãžã§ãã¬ãŒã¿ãŒã®å æ¬çãªã¬ã€ããã€ãã¬ãŒã¿ãŒãããã³ã«ãéåæã€ãã¬ãŒã·ã§ã³ãããã³ææ°ã®JavaScriptéçºã«ãããé«åºŠãªãŠãŒã¹ã±ãŒã¹ãã«ããŒããŸãã
JavaScriptãžã§ãã¬ãŒã¿ãŒ: ã€ãã¬ãŒã¿ãŒãããã³ã«ãšéåæã€ãã¬ãŒã·ã§ã³ããã¹ã¿ãŒãã
JavaScriptãžã§ãã¬ãŒã¿ãŒã¯ãã€ãã¬ãŒã·ã§ã³ãå¶åŸ¡ããéåææäœã管çããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãããããã¯ã€ãã¬ãŒã¿ãŒãããã³ã«ã«åºã¥ããŠæ§ç¯ãããéåæããŒã¿ã¹ããªãŒã ãã·ãŒã ã¬ã¹ã«åŠçããããã«æ¡åŒµãããŠããŸãããã®ã¬ã€ãã§ã¯ãJavaScriptãžã§ãã¬ãŒã¿ãŒã®äž»èŠãªæŠå¿µãé«åºŠãªæ©èœãããã³ææ°ã®JavaScriptéçºã«ãããå®è·µçãªã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠå æ¬çã«è§£èª¬ããŸãã
ã€ãã¬ãŒã¿ãŒãããã³ã«ãçè§£ãã
ã€ãã¬ãŒã¿ãŒãããã³ã«ã¯ãJavaScriptã«ããããªããžã§ã¯ãã®ã€ãã¬ãŒã·ã§ã³æ¹æ³ãå®çŸ©ããåºæ¬çãªæŠå¿µã§ããããã«ã¯2ã€ã®äž»èŠãªèŠçŽ ãå«ãŸããŸãã
- IterableïŒã€ãã©ãã«ïŒ: ã€ãã¬ãŒã¿ãŒãè¿ãã¡ãœããïŒ
Symbol.iteratorïŒãæã€ãªããžã§ã¯ãã - IteratorïŒã€ãã¬ãŒã¿ãŒïŒ:
next()ã¡ãœãããå®çŸ©ãããªããžã§ã¯ããnext()ã¡ãœããã¯ã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããè¿ããŸããvalueïŒã·ãŒã±ã³ã¹å ã®æ¬¡ã®å€ïŒãšdoneïŒã€ãã¬ãŒã·ã§ã³ãå®äºãããã©ããã瀺ãçåœå€ïŒã
ç°¡åãªäŸã§èª¬æããŸãããã
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const value of myIterable) {
console.log(value); // Output: 1, 2, 3
}
ãã®äŸã§ã¯ãmyIterableã¯Symbol.iteratorã¡ãœãããæã€ããã€ãã©ãã«ãªããžã§ã¯ãã§ããSymbol.iteratorã¡ãœããã¯ãå€1ã2ã3ã1ã€ãã€çæããnext()ã¡ãœãããæã€ã€ãã¬ãŒã¿ãŒãªããžã§ã¯ããè¿ããŸããã€ãã¬ãŒã·ã§ã³ããå€ããªããªããšãdoneããããã£ã¯trueã«ãªããŸãã
JavaScriptãžã§ãã¬ãŒã¿ãŒã®ç޹ä»
ãžã§ãã¬ãŒã¿ãŒã¯ãJavaScriptã«ãããäžæåæ¢ãšåéãå¯èœãªç¹æ®ãªé¢æ°ã§ãããããã䜿çšãããšãè€æ°ã®åŒã³åºãéã§ç¶æ
ãç¶æãã颿°ãäœæããããšã§ãå埩ã¢ã«ãŽãªãºã ãå®çŸ©ã§ããŸãããžã§ãã¬ãŒã¿ãŒã¯function*æ§æãšyieldããŒã¯ãŒãã䜿çšããŸãã
ç°¡åãªãžã§ãã¬ãŒã¿ãŒã®äŸã次ã«ç€ºããŸãã
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const generator = numberGenerator();
console.log(generator.next()); // Output: { value: 1, done: false }
console.log(generator.next()); // Output: { value: 2, done: false }
console.log(generator.next()); // Output: { value: 3, done: false }
console.log(generator.next()); // Output: { value: undefined, done: true }
numberGenerator()ãåŒã³åºããšãããã«ãã¡ã³ã¯ã·ã§ã³ããã£ã¯å®è¡ãããŸããã代ããã«ããžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ããè¿ããŸããgenerator.next()ãåŒã³åºããã³ã«ãyieldããŒã¯ãŒãã«ééãããŸã§é¢æ°ãå®è¡ãããŸããyieldããŒã¯ãŒãã¯é¢æ°ãäžæåæ¢ããyieldãããå€ãå«ããªããžã§ã¯ããè¿ããŸããnext()ãå床åŒã³åºããããšã颿°ã¯äžæããç®æããåéãããŸãã
ãžã§ãã¬ãŒã¿ãŒé¢æ°ãšéåžžã®é¢æ°
ãžã§ãã¬ãŒã¿ãŒé¢æ°ãšéåžžã®é¢æ°ã®äž»ãªéãã¯æ¬¡ã®ãšããã§ãã
- ãžã§ãã¬ãŒã¿ãŒé¢æ°ã¯
functionã®ä»£ããã«function*ã䜿çšããŠå®çŸ©ãããŸãã - ãžã§ãã¬ãŒã¿ãŒé¢æ°ã¯
yieldããŒã¯ãŒãã䜿çšããŠãå®è¡ãäžæåæ¢ãå€ãè¿ããŸãã - ãžã§ãã¬ãŒã¿ãŒé¢æ°ãåŒã³åºããšã颿°ã®çµæã§ã¯ãªããžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ããè¿ãããŸãã
ã€ãã¬ãŒã¿ãŒãããã³ã«ã§ã®ãžã§ãã¬ãŒã¿ãŒã®äœ¿çš
ãžã§ãã¬ãŒã¿ãŒã¯ã€ãã¬ãŒã¿ãŒãããã³ã«ã«èªåçã«æºæ ããŸããããã«ãããfor...ofã«ãŒããä»ã®ã€ãã¬ãŒã¿ãŒãæ¶è²»ãã颿°ã§çŽæ¥äœ¿çšã§ããŸãã
function* fibonacciGenerator() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fibonacci = fibonacciGenerator();
for (let i = 0; i < 10; i++) {
console.log(fibonacci.next().value); // Output: The first 10 Fibonacci numbers
}
ãã®äŸã§ã¯ãfibonacciGenerator()ã¯ãã£ããããæ°åãçæããç¡éãžã§ãã¬ãŒã¿ãŒã§ãããžã§ãã¬ãŒã¿ãŒã€ã³ã¹ã¿ã³ã¹ãäœæãããããã€ãã¬ãŒã·ã§ã³ããŠæåã®10åã®æ°å€ãåºåããŸããã€ãã¬ãŒã·ã§ã³ãå¶éããªããšããã®ãžã§ãã¬ãŒã¿ãŒã¯æ°žé ã«å®è¡ãããããšã«æ³šæããŠãã ããã
ãžã§ãã¬ãŒã¿ãŒãžã®å€ã®åŒãæž¡ã
next()ã¡ãœããã䜿çšããŠãå€ããžã§ãã¬ãŒã¿ãŒã«æž¡ãããšãã§ããŸããnext()ã«æž¡ãããå€ã¯ãyieldåŒã®çµæãšãªããŸãã
function* echoGenerator() {
const input = yield;
console.log(`You entered: ${input}`);
}
const echo = echoGenerator();
echo.next(); // Start the generator
echo.next("Hello, World!"); // Output: You entered: Hello, World!
ãã®å Žåãæåã®next()åŒã³åºãã§ãžã§ãã¬ãŒã¿ãŒãéå§ãããŸãã2çªç®ã®next("Hello, World!")åŒã³åºãã¯ãæååãHello, World!ãããžã§ãã¬ãŒã¿ãŒã«æž¡ãããããinput倿°ã«ä»£å
¥ãããŸãã
é«åºŠãªãžã§ãã¬ãŒã¿ãŒæ©èœ
yield*: ä»ã®ã€ãã©ãã«ãžã®å§è²
yield*ããŒã¯ãŒãã䜿çšãããšãä»ã®ãžã§ãã¬ãŒã¿ãŒãå«ãå¥ã®ã€ãã©ãã«ãªããžã§ã¯ãã«ã€ãã¬ãŒã·ã§ã³ãå§è²ã§ããŸãã
function* subGenerator() {
yield 4;
yield 5;
yield 6;
}
function* mainGenerator() {
yield 1;
yield 2;
yield 3;
yield* subGenerator();
yield 7;
yield 8;
}
const main = mainGenerator();
for (const value of main) {
console.log(value); // Output: 1, 2, 3, 4, 5, 6, 7, 8
}
yield* subGenerator()è¡ã¯ãsubGenerator()ã«ãã£ãŠçæãããå€ãmainGenerator()ã®ã·ãŒã±ã³ã¹ã«å¹æçã«æ¿å
¥ããŸãã
return() ããã³ throw() ã¡ãœãã
ãžã§ãã¬ãŒã¿ãŒãªããžã§ã¯ãã«ã¯ããžã§ãã¬ãŒã¿ãŒãéäžã§çµäºããããããšã©ãŒããžã§ãã¬ãŒã¿ãŒã«ã¹ããŒãããã§ããreturn()ããã³throw()ã¡ãœããããããŸãã
function* exampleGenerator() {
try {
yield 1;
yield 2;
yield 3;
} finally {
console.log("Cleaning up...");
}
}
const gen = exampleGenerator();
console.log(gen.next()); // Output: { value: 1, done: false }
console.log(gen.return("Finished")); // Output: Cleaning up...
// Output: { value: 'Finished', done: true }
console.log(gen.next()); // Output: { value: undefined, done: true }
function* errorGenerator() {
try {
yield 1;
yield 2;
} catch (e) {
console.error("Error caught:", e);
}
yield 3;
}
const errGen = errorGenerator();
console.log(errGen.next()); // Output: { value: 1, done: false }
console.log(errGen.throw(new Error("Something went wrong!"))); // Output: Error caught: Error: Something went wrong!
// Output: { value: 3, done: false }
console.log(errGen.next()); // Output: { value: undefined, done: true }
return()ã¡ãœããã¯ãfinallyãããã¯ïŒååšããå ŽåïŒãå®è¡ããdoneããããã£ãtrueã«èšå®ããŸããthrow()ã¡ãœããã¯ããžã§ãã¬ãŒã¿ãŒå
ã§ãšã©ãŒãã¹ããŒããããã¯try...catchãããã¯ã䜿çšããŠææã§ããŸãã
éåæã€ãã¬ãŒã·ã§ã³ãšéåæãžã§ãã¬ãŒã¿ãŒ
éåæã€ãã¬ãŒã·ã§ã³ã¯ãã€ãã¬ãŒã¿ãŒãããã³ã«ãæ¡åŒµããŠéåæããŒã¿ã¹ããªãŒã ãåŠçããŸããããã«ã¯2ã€ã®æ°ããæŠå¿µãå°å ¥ãããŸãã
- Async IterableïŒéåæã€ãã©ãã«ïŒ: éåæã€ãã¬ãŒã¿ãŒãè¿ãã¡ãœããïŒ
Symbol.asyncIteratorïŒãæã€ãªããžã§ã¯ãã - Async IteratorïŒéåæã€ãã¬ãŒã¿ãŒïŒ: Promiseãè¿ã
next()ã¡ãœãããå®çŸ©ãããªããžã§ã¯ããPromiseã¯ã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ãïŒvalueïŒã·ãŒã±ã³ã¹å ã®æ¬¡ã®å€ïŒãšdoneïŒã€ãã¬ãŒã·ã§ã³ãå®äºãããã©ããã瀺ãçåœå€ïŒïŒã§è§£æ±ºãããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåæã€ãã¬ãŒã¿ãŒãäœæãã䟿å©ãªæ¹æ³ãæäŸããŸãããããã¯async function*æ§æãšawaitããŒã¯ãŒãã䜿çšããŸãã
async function* asyncNumberGenerator() {
await delay(1000); // Simulate an asynchronous operation
yield 1;
await delay(1000);
yield 2;
await delay(1000);
yield 3;
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
const asyncGenerator = asyncNumberGenerator();
for await (const value of asyncGenerator) {
console.log(value); // Output: 1, 2, 3 (with 1 second delay between each)
}
}
main();
ãã®äŸã§ã¯ãasyncNumberGenerator()ã¯ãåæ°å€ã®éã«1ç§ã®é
å»¶ã䌎ã£ãŠæ°å€ãçæããéåæãžã§ãã¬ãŒã¿ãŒã§ããfor await...ofã«ãŒãã¯ãéåæãžã§ãã¬ãŒã¿ãŒãã€ãã¬ãŒã·ã§ã³ããããã«äœ¿çšãããŸããawaitããŒã¯ãŒãã¯ãåå€ãéåæçã«åŠçãããããšãä¿èšŒããŸãã
éåæã€ãã©ãã«ãæåã§äœæãã
éåæãžã§ãã¬ãŒã¿ãŒã¯éåæã€ãã©ãã«ãäœæããæãç°¡åãªæ¹æ³ã§ãããSymbol.asyncIteratorã䜿çšããŠæåã§äœæããããšãã§ããŸãã
const myAsyncIterable = {
data: [1, 2, 3],
[Symbol.asyncIterator]() {
let index = 0;
return {
next: async () => {
await delay(500);
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
async function main2() {
for await (const value of myAsyncIterable) {
console.log(value); // Output: 1, 2, 3 (with 0.5 second delay between each)
}
}
main2();
ãžã§ãã¬ãŒã¿ãŒãšéåæãžã§ãã¬ãŒã¿ãŒã®ãŠãŒã¹ã±ãŒã¹
ãžã§ãã¬ãŒã¿ãŒãšéåæãžã§ãã¬ãŒã¿ãŒã¯ã以äžã®ãããªæ§ã ãªã·ããªãªã§åœ¹ç«ã¡ãŸãã
- é å»¶è©äŸ¡: å€ããªã³ããã³ãã§çæããããšã§ãç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ããã©ãŒãã³ã¹ãåäžãããã¡ã¢ãªäœ¿çšéãåæžã§ããŸããäŸãã°ãå€§èŠæš¡ãªCSVãã¡ã€ã«ãã¡ã¢ãªã«ãã¹ãŠèªã¿èŸŒãŸãã«è¡ããšã«åŠçããå Žåãªã©ã§ãã
- ç¶æ 管ç: è€æ°ã®é¢æ°åŒã³åºãéã§ç¶æ ãç¶æããããšã§ãè€éãªã¢ã«ãŽãªãºã ãç°¡çŽ åã§ããŸããäŸãã°ãç°ãªãç¶æ ãšé·ç§»ãæã€ã²ãŒã ãå®è£ ããå Žåãªã©ã§ãã
- éåæããŒã¿ã¹ããªãŒã : ãµãŒããŒããã®ããŒã¿ããŠãŒã¶ãŒå ¥åãªã©ãéåæããŒã¿ã¹ããªãŒã ãåŠçããŸããäŸãã°ãããŒã¿ããŒã¹ããªã¢ã«ã¿ã€ã APIããããŒã¿ãã¹ããªãŒãã³ã°ããå Žåãªã©ã§ãã
- å¶åŸ¡ãããŒ: ã³ã«ãŒãã³ãªã©ã®ã«ã¹ã¿ã å¶åŸ¡ãããŒã¡ã«ããºã ãå®è£ ããŸãã
- ãã¹ã: åäœãã¹ãã§è€éãªéåæã·ããªãªãã·ãã¥ã¬ãŒãããŸãã
æ§ã ãªå°åã§ã®äŸ
ãžã§ãã¬ãŒã¿ãŒãšéåæãžã§ãã¬ãŒã¿ãŒãæ§ã ãªå°åãæèã§ã©ã®ããã«äœ¿çšã§ããããããã€ãã®äŸãèããŠã¿ãŸãããã
- Eã³ããŒã¹ïŒã°ããŒãã«ïŒ: ããŒã¿ããŒã¹ããçµæããã£ã³ã¯åäœã§ååŸããååæ€çŽ¢ããéåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠå®è£ ããŸããããã«ããããŠãŒã¶ãŒã®å Žæããããã¯ãŒã¯é床ã«é¢ä¿ãªããçµæãå©çšå¯èœã«ãªãã«ã€ããŠUIãæ®µéçã«æŽæ°ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã
- éèã¢ããªã±ãŒã·ã§ã³ïŒãšãŒãããïŒ: ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãå€§èŠæš¡ãªéèããŒã¿ã»ããïŒäŸïŒæ ªåŒåžå ŽããŒã¿ïŒãå¹ççã«èšç®ããã¬ããŒããçæããŸããããã¯èŠå¶éµå®ãšãªã¹ã¯ç®¡çã«ãšã£ãŠéåžžã«éèŠã§ãã
- ããžã¹ãã£ã¯ã¹ïŒã¢ãžã¢ïŒ: éåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãGPSããã€ã¹ãããªã¢ã«ã¿ã€ã ã®äœçœ®ããŒã¿ãã¹ããªãŒã ãã貚ç©ã远跡ããŠé éã«ãŒããæé©åããŸããããã«ãããè€éãªç©æµèª²é¡ãæ±ããå°åã§ã®å¹çæ¹åãšã³ã¹ãåæžã«åœ¹ç«ã¡ãŸãã
- æè²ïŒã¢ããªã«ïŒ: éåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãã³ã³ãã³ããåçã«ååŸããã€ã³ã¿ã©ã¯ãã£ããªåŠç¿ã¢ãžã¥ãŒã«ãéçºããŸããããã«ãããããŒãœãã©ã€ãºãããåŠç¿äœéšãå¯èœã«ãªãã垯åå¹ ãéãããŠããå°åã®åŠçã§ãæè²ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã
- ãã«ã¹ã±ã¢ïŒã¢ã¡ãªã«å€§éžïŒ: éåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãå»çã»ã³ãµãŒããã®æ£è ããŒã¿ãåŠçãããã€ã¿ã«ãµã€ã³ãç£èŠããŠãªã¢ã«ã¿ã€ã ã§ç°åžžãæ€åºããŸããããã«ãããæ£è ã±ã¢ãåäžããå»çé誀ã®ãªã¹ã¯ãæžããããšãã§ããŸãã
ãžã§ãã¬ãŒã¿ãŒäœ¿çšã®ãã¹ããã©ã¯ãã£ã¹
- å埩ã¢ã«ãŽãªãºã ã«ã¯ãžã§ãã¬ãŒã¿ãŒã䜿çšãã: ãžã§ãã¬ãŒã¿ãŒã¯ãã€ãã¬ãŒã·ã§ã³ãšç¶æ 管çã䌎ãã¢ã«ãŽãªãºã ã«é©ããŠããŸãã
- éåæããŒã¿ã¹ããªãŒã ã«ã¯éåæãžã§ãã¬ãŒã¿ãŒã䜿çšãã: éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåæããŒã¿ã¹ããªãŒã ã®åŠçãšéåææäœã®å®è¡ã«æé©ã§ãã
- ãšã©ãŒãé©åã«åŠçãã: ãžã§ãã¬ãŒã¿ãŒããã³éåæãžã§ãã¬ãŒã¿ãŒå
ã®ãšã©ãŒãåŠçããã«ã¯ã
try...catchãããã¯ã䜿çšããŸãã - å¿
èŠã«å¿ããŠãžã§ãã¬ãŒã¿ãŒãçµäºãã: å¿
èŠã«å¿ããŠãžã§ãã¬ãŒã¿ãŒãéäžã§çµäºãããã«ã¯ã
return()ã¡ãœããã䜿çšããŸãã - ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ãã: ãžã§ãã¬ãŒã¿ãŒã¯å Žåã«ãã£ãŠã¯ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããªãŒããŒããããçºçãããããšããããŸãããžã§ãã¬ãŒã¿ãŒãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«é©ããéžæè¢ã§ããããšã確èªããããã«ãã³ãŒãã培åºçã«ãã¹ãããŠãã ããã
çµè«
JavaScriptãžã§ãã¬ãŒã¿ãŒãšéåæãžã§ãã¬ãŒã¿ãŒã¯ãææ°ã®JavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ããã€ãã¬ãŒã¿ãŒãããã³ã«ãçè§£ããyieldããã³awaitããŒã¯ãŒãããã¹ã¿ãŒããããšã§ãããå¹ççã§ä¿å®æ§ãé«ããã¹ã±ãŒã©ãã«ãªã³ãŒããæžãããšãã§ããŸããå€§èŠæš¡ãªããŒã¿ã»ããã®åŠçãéåææäœã®ç®¡çãè€éãªã¢ã«ãŽãªãºã ã®å®è£
ãªã©ããžã§ãã¬ãŒã¿ãŒã¯å¹
åºãããã°ã©ãã³ã°èª²é¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã
ãã®å æ¬çãªã¬ã€ãã¯ããžã§ãã¬ãŒã¿ãŒã广çã«äœ¿çšãå§ããããã«å¿ èŠãªç¥èãšäŸãæäŸããŸãããäŸã詊ããŠæ§ã ãªãŠãŒã¹ã±ãŒã¹ãæ¢çŽ¢ãããããžã§ã¯ãã§JavaScriptãžã§ãã¬ãŒã¿ãŒã®å¯èœæ§ãæå€§éã«åŒãåºããŠãã ããã